using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._AreaandVolume
{
    /// <summary>
    /// <para>Minimum Bounding Volume</para>
    /// <para>Creates multipatch features that represent the volume of space occupied by a set of 3D features.</para>
    /// <para>创建表示一组 3D 要素所占用空间体积的多面体要素。</para>
    /// </summary>    
    [DisplayName("Minimum Bounding Volume")]
    public class MinimumBoundingVolume : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public MinimumBoundingVolume()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The LAS dataset or 3D features whose minimum bounding volume will be evaluated.</para>
        /// <para>将评估其最小边界体积的 LAS 数据集或 3D 要素。</para>
        /// </param>
        /// <param name="_z_value">
        /// <para>Z Value</para>
        /// <para>The source of z-values for the input data.</para>
        /// <para>输入数据的 z 值的来源。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// </param>
        public MinimumBoundingVolume(object _in_features, object _z_value, object _out_feature_class)
        {
            this._in_features = _in_features;
            this._z_value = _z_value;
            this._out_feature_class = _out_feature_class;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Minimum Bounding Volume";

        public override string CallName => "3d.MinimumBoundingVolume";

        public override List<string> AcceptEnvironments => ["extent", "geographicTransformations", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_in_features, _z_value, _out_feature_class, _geometry_type.GetGPValue(), _group.GetGPValue(), _group_field, _mbv_fields.GetGPValue()];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The LAS dataset or 3D features whose minimum bounding volume will be evaluated.</para>
        /// <para>将评估其最小边界体积的 LAS 数据集或 3D 要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Z Value</para>
        /// <para>The source of z-values for the input data.</para>
        /// <para>输入数据的 z 值的来源。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Value")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _z_value { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Output Feature Class Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the method that will be used to determine the geometry of the minimum bounding volume.</para>
        ///   <bulletList>
        ///     <bullet_item>Convex hull—The smallest convex region surrounding the input data.</bullet_item><para/>
        ///     <bullet_item>Sphere—The smallest sphere enclosing the input data.</bullet_item><para/>
        ///     <bullet_item>Envelope—The XYZ extent of the input data.</bullet_item><para/>
        ///     <bullet_item>Concave hull—The concave hull that encloses the input data.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将用于确定最小边界体积的几何的方法。</para>
        ///   <bulletList>
        ///     <bullet_item>凸包 - 输入数据周围的最小凸区域。</bullet_item><para/>
        ///     <bullet_item>球体 （Sphere） - 包含输入数据的最小球体。</bullet_item><para/>
        ///     <bullet_item>包络 - 输入数据的 XYZ 范围。</bullet_item><para/>
        ///     <bullet_item>凹形船体 （Concave hull） - 封闭输入数据的凹形船体。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _geometry_type_value _geometry_type { get; set; } = _geometry_type_value._CONVEX_HULL;

        public enum _geometry_type_value
        {
            /// <summary>
            /// <para>Convex hull</para>
            /// <para>Convex hull—The smallest convex region surrounding the input data.</para>
            /// <para>凸包 - 输入数据周围的最小凸区域。</para>
            /// </summary>
            [Description("Convex hull")]
            [GPEnumValue("CONVEX_HULL")]
            _CONVEX_HULL,

            /// <summary>
            /// <para>Sphere</para>
            /// <para>Sphere—The smallest sphere enclosing the input data.</para>
            /// <para>球体 （Sphere） - 包含输入数据的最小球体。</para>
            /// </summary>
            [Description("Sphere")]
            [GPEnumValue("SPHERE")]
            _SPHERE,

            /// <summary>
            /// <para>Envelope</para>
            /// <para>Envelope—The XYZ extent of the input data.</para>
            /// <para>包络 - 输入数据的 XYZ 范围。</para>
            /// </summary>
            [Description("Envelope")]
            [GPEnumValue("ENVELOPE")]
            _ENVELOPE,

            /// <summary>
            /// <para>Concave hull</para>
            /// <para>Concave hull—The concave hull that encloses the input data.</para>
            /// <para>凹形船体 （Concave hull） - 封闭输入数据的凹形船体。</para>
            /// </summary>
            [Description("Concave hull")]
            [GPEnumValue("CONCAVE_HULL")]
            _CONCAVE_HULL,

        }

        /// <summary>
        /// <para>Group Options</para>
        /// <para><xdoc>
        ///   <para>Specifies how the input features will be grouped; each group will be enclosed with one output multipatch.</para>
        ///   <bulletList>
        ///     <bullet_item>None—Input features will not be grouped. This is the default. This option is not available for point input.</bullet_item><para/>
        ///     <bullet_item>All—All input features will be treated as one group.</bullet_item><para/>
        ///     <bullet_item>List—Input features will be grouped based on their common values in the specified field or fields in the group field parameter.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何对输入要素进行分组;每个组将用一个输出多面体封闭。</para>
        ///   <bulletList>
        ///     <bullet_item>无—不会对输入要素进行分组。这是默认设置。此选项不适用于点输入。</bullet_item><para/>
        ///     <bullet_item>全部—所有输入要素将被视为一个组。</bullet_item><para/>
        ///     <bullet_item>列表 - 输入要素将根据其在指定字段中的通用值或组字段参数中的字段进行分组。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Group Options")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _group_value _group { get; set; } = _group_value._NONE;

        public enum _group_value
        {
            /// <summary>
            /// <para>None</para>
            /// <para>None—Input features will not be grouped. This is the default. This option is not available for point input.</para>
            /// <para>无—不会对输入要素进行分组。这是默认设置。此选项不适用于点输入。</para>
            /// </summary>
            [Description("None")]
            [GPEnumValue("NONE")]
            _NONE,

            /// <summary>
            /// <para>All</para>
            /// <para>All—All input features will be treated as one group.</para>
            /// <para>全部—所有输入要素将被视为一个组。</para>
            /// </summary>
            [Description("All")]
            [GPEnumValue("ALL")]
            _ALL,

            /// <summary>
            /// <para>List</para>
            /// <para>List—Input features will be grouped based on their common values in the specified field or fields in the group field parameter.</para>
            /// <para>列表 - 输入要素将根据其在指定字段中的通用值或组字段参数中的字段进行分组。</para>
            /// </summary>
            [Description("List")]
            [GPEnumValue("LIST")]
            _LIST,

        }

        /// <summary>
        /// <para>Group Field(s)</para>
        /// <para>The field or fields in the input features that will be used to group features when List is specified as Group Option. At least one group field is required for the List option. All features that have the same value in the specified field or fields will be treated as a group.</para>
        /// <para>将列表指定为“组选项”时将用于对要素进行分组的输入要素中的一个或多个字段。“列表”选项至少需要一个组字段。在指定字段中具有相同值的所有要素都将被视为一个组。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Group Field(s)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _group_field { get; set; } = null;


        /// <summary>
        /// <para>Add geometry characteristics as attributes to output</para>
        /// <para><xdoc>
        ///   <para>Specifies whether each feature will be attributed with the volume and surface area of the minimum bounding volume.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—No geometric attributes will be added to the output feature. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—Geometric attributes will be added to the output feature.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否将每个要素归因于最小边界体积的体积和表面积。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 不会向输出要素添加任何几何属性。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 （Checked） - 将几何属性添加到输出要素中。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Add geometry characteristics as attributes to output")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _mbv_fields_value _mbv_fields { get; set; } = _mbv_fields_value._false;

        public enum _mbv_fields_value
        {
            /// <summary>
            /// <para>MBV_FIELDS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("MBV_FIELDS")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_MBV_FIELDS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_MBV_FIELDS")]
            [GPEnumValue("false")]
            _false,

        }

        public MinimumBoundingVolume SetEnv(object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}